#include<iostream>
#include<cstring>
using namespace std;
const int N = 200003, null = 0x3f3f3f3f;
int h[N];//,e[N],ne[N],idx;

//开放寻址法
//find:找到返回x，找不到返回x应存地址
int find(int x)
{
    int k = (x % N + N) % N;
    while (h[k] != null && h[k] != x)//当前k位置有存放值
    {
        k++;
        if (k == N)    k = 0;
    }
    //退出循环的条件：h[k]==0 || h[k]==x
    return k;
}
int main()
{
    int n, x;
    cin >> n;
    memset(h, 0x3f, sizeof h);//-1
    char op[3];
    while (n--)
    {
        scanf("%s", op);
        cin >> x;
        int k = find(x);
        if (*op == 'I') h[k] = x;
        else
        {
            if (h[k] != null)  puts("Yes");  //k!=null
            else puts("No");
        }
    }
    return 0;
}

/*
1.AcWing 840. 五种方法，运行时间差别有点意外
O(nlogn)的做法：
map: 249ms
set: 230ms

据说map的常数系数挺大的，这个还可。

O(n)做法
但是
unordered_map：164ms
拉链法：53ms
开放寻址法：53ms

2.
*在拉链法中清空数组操作为：
    memset(h, -1, sizeof h); 
*在开放寻址法中清空数组操作为：
    memset(h, 0x3f, sizeof h);
*前者是模拟邻接表的预处理操作 将尾结点置为 -1,邻接表那里若没有初始化为-1 则在遍历链表操作的时候会死循环
 后者是数组全部初始化为0x3f3f3f3f 若为0x3f3f3f3f则表示该地址没有数值*/
